package com.ruoyi.framework.report.interceptor;
 
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.report.config.ReportConfig;
import com.ruoyi.framework.report.service.ReportTokenService;
import com.ruoyi.framework.web.service.TokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
 
@Component
public class ReportInterceptor implements HandlerInterceptor {
 
    @Autowired
    private TokenService tokenService;
 
    @Autowired
    private ReportConfig reportConfig;
 
    @Autowired
    private ReportTokenService reportTokenService;
 
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 
        String token = reportTokenService.getToken(request);
        LoginUser loginUser = tokenService.getLoginUser(token);
//        String uri = request.getRequestURI();
//        System.out.println(uri);
 
        if (StringUtils.isNotNull(loginUser)) {
            SysUser user = loginUser.getUser();
 
            // 超级管理员放权
            if (StringUtils.isNotNull(user) && user.isAdmin()) {
                return true;
            } else {
                //获取权限集合
                Set<String> permissions = loginUser.getPermissions();
                //如果拥有设计器的权限，则无需view权限，也可以通过校验
                if (StringUtils.isNotNull(permissions)) {
                    String uri = request.getRequestURI();
 
                    // 如果访问报表
                    if (uri.contains("/jmreport/")) {
                        // 如果有操作权限，直接放行
                        if (permissions.contains(reportConfig.getReportEditPermission())) {
                            return true;
                        } else {
                            // 设置查询报表的路径，没有带报表编码的路径
                            Set<String> queryReportSet = new HashSet<>();
                            queryReportSet.add("/jmreport/getQueryInfo");
                            queryReportSet.add("/jmreport/show");
 
                            // 设置查询报表的路径，带报表编码的路径
                            ArrayList<String> queryReportList = new ArrayList<>();
                            queryReportList.add("/jmreport/view/");
                            queryReportList.add("/jmreport/addViewCount/");
                            queryReportList.add("/jmreport/checkParam/");
 
                            // 如果有查询权限
                            if (permissions.contains(reportConfig.getReportQueryPermission())) {
 
                                // 如果是没有报表编码的路径，放行
                                if (queryReportSet.contains(uri)) {
                                    return true;
                                } else {
 
                                    // 如果是带报表编码的路径，放行
                                    for (int i = 0; i < queryReportList.size(); i++) {
                                        String s = queryReportList.get(i);
                                        if (uri.contains(s)) {
                                            return true;
                                        }
                                    }
 
                                }
 
                            }
                        }
 
                        //如果访问大屏
                    } else if (uri.contains("/drag/")) {
 
                        // 如果有操作权限，直接放行
                        if (permissions.contains(reportConfig.getDragEditPermission())) {
                            return true;
                        } else {
                            // 设置查询大屏的路径，完全路径
                            Set<String> queryDragSet = new HashSet<>();
                            queryDragSet.add("/drag/page/queryById");
                            queryDragSet.add("/drag/page/addVisitsNumber");
 
 
                            // 设置查询大屏的路径，带有包含部分路径
                            ArrayList<String> queryDragList = new ArrayList<>();
                            queryDragList.add("/drag/share/view/");
                            queryDragList.add("/drag/mock/json/");
 
                            // 如果有查询权限，并且访问的查询接口，放行
                            if (permissions.contains(reportConfig.getDragQueryPermission()) && queryDragSet.contains(uri)) {
                                return true;
                            }
                        }
                        // 拦截非报表和大屏路径处理，正确配置，不会出现此情况。
                    } else {
                        return true;
                    }
 
                }
            }
        }
        AjaxResult ajaxResult = AjaxResult.error(403, "当前操作没有权限");
        ServletUtils.renderString(response, JSONObject.toJSONString(ajaxResult));
        return false;
    }
}